// Copyright Epic Games, Inc. All Rights Reserved.

#pragma once

#include "Engine/DeveloperSettingsBackedByCVars.h"

#include "Engine/PlatformSettings.h"


#include "GameplayTagContainer.h"


#include "LyraPerformanceSettings.generated.h"


enum class ELyraDisplayablePerformanceStat : uint8; // 前置声明：可显示的性能统计指标枚举

class UObject; // 前置声明：UObject类

// 描述一个平台特定的设备配置变体，用户可以在UI中选择
USTRUCT()
struct FLyraQualityDeviceProfileVariant
{
	GENERATED_BODY()

	// 此设备配置变体的显示名称（在选项屏幕中可见）
	UPROPERTY(EditAnywhere)
	FText DisplayName;

	// 为当前平台的基准设备配置名称附加的后缀
	UPROPERTY(EditAnywhere)
	FString DeviceProfileSuffix;

	// 启用此模式所需的最低刷新率
	// （例如，如果设置为120 Hz，而设备连接到60 Hz的显示器，则此模式不可用）
	UPROPERTY(EditAnywhere)
	int32 MinRefreshRate = 0; // 最小刷新率，默认为0表示无限制
};

// 描述一组用户可以在设置中启用的性能统计信息，其可见性取决于平台特性的查询结果
USTRUCT()
struct FLyraPerformanceStatGroup
{
	GENERATED_BODY()

	// 对平台特性的查询，用于确定是否可能显示一组统计信息
	UPROPERTY(EditAnywhere, meta=(Categories = "Input,Platform.Trait"))
	FGameplayTagQuery VisibilityQuery; // 可见性查询，使用Gameplay Tag Query

	// 如果查询通过，则允许显示的统计信息集合
	UPROPERTY(EditAnywhere)
	TSet<ELyraDisplayablePerformanceStat> AllowedStats; // 允许的性能统计指标集合
};

// 帧节奏控制和整体图形设置如何被控制/暴露给平台？
UENUM()
enum class ELyraFramePacingMode : uint8
{
	// 手动帧率限制，允许用户选择是否锁定垂直同步
	DesktopStyle, // 桌面风格

	// 通过设备配置驱动的呈现间隔来处理限制
	ConsoleStyle, // 主机风格

	// 通过用户面对特定设备允许的设备配置所支持的帧率选择来处理限制
	MobileStyle // 移动风格
};

UCLASS(config=Game, defaultconfig)
class ULyraPlatformSpecificRenderingSettings : public UPlatformSettings
{
	GENERATED_BODY()

public:
	ULyraPlatformSpecificRenderingSettings(); // 构造函数

	// 辅助方法，通过平台设置获取性能设置对象
	static const ULyraPlatformSpecificRenderingSettings* Get();

public:
	// 要附加的默认变体后缀，通常应是 UserFacingDeviceProfileOptions 的成员之一，除非当前平台只有一个选项
	//
	// 注意：这通常通过平台特定的ini文件设置，而不是通过UI
	UPROPERTY(EditAnywhere, Config, Category=DeviceProfiles)
	FString DefaultDeviceProfileSuffix; // 默认设备配置后缀

	// 要在设置中允许用户选择的设备配置变体列表
	//
	// 这些应按目标帧率从慢到快排序：
	//   如果当前显示器不支持用户选择的刷新率，我们将尝试
	//   之前的条目，直到找到可用的为止
	//
	// 注意：这通常通过平台特定的ini文件设置，而不是通过UI
	UPROPERTY(EditAnywhere, Config, Category=DeviceProfiles)
	TArray<FLyraQualityDeviceProfileVariant> UserFacingDeviceProfileOptions; // 面向用户的设备配置选项列表

	// 该平台是否支持细粒度的视频质量设置？
	UPROPERTY(EditAnywhere, Config, Category=VideoSettings)
	bool bSupportsGranularVideoQualitySettings = true; // 是否支持细粒度视频质量设置

	// 该平台是否支持运行自动质量基准测试（通常只有在 bSupportsGranularVideoQualitySettings 也为 true 时才应为 true）
	UPROPERTY(EditAnywhere, Config, Category=VideoSettings)
	bool bSupportsAutomaticVideoQualityBenchmark = true; // 是否支持自动视频质量基准测试

	// 帧节奏如何控制
	UPROPERTY(EditAnywhere, Config, Category=VideoSettings)
	ELyraFramePacingMode FramePacingMode = ELyraFramePacingMode::DesktopStyle; // 帧节奏控制模式，默认为桌面风格

	// 为移动设备显示的潜在帧率
	// 注意：这进一步受到平台特定设备配置中的 Lyra.DeviceProfile.Mobile.MaxFrameRate 和平台帧节奏器报告的支持范围的限制
	UPROPERTY(EditAnywhere, Config, Category=VideoSettings, meta=(EditCondition="FramePacingMode==ELyraFramePacingMode::MobileStyle", ForceUnits=Hz))
	TArray<int32> MobileFrameRateLimits; // 移动设备帧率限制列表
};

//////////////////////////////////////////////////////////////////////

/**
 * 项目特定的性能配置文件设置。
 */
UCLASS(config=Game, defaultconfig, meta=(DisplayName="Lyra Performance Settings"))
class ULyraPerformanceSettings : public UDeveloperSettingsBackedByCVars
{
	GENERATED_BODY()

public:
	ULyraPerformanceSettings(); // 构造函数

private:
	// 这是一个特殊的辅助工具，用于暴露每个平台的设置，以便可以在项目设置中编辑
	// 永远不需要直接访问它
	UPROPERTY(EditAnywhere, Category = "PlatformSpecific")
	FPerPlatformSettings PerPlatformSettings; // 每个平台的设置

public:
	// 在桌面平台的各种“帧率限制”视频设置中允许用户选择的帧率列表
	UPROPERTY(EditAnywhere, Config, Category=Performance, meta=(ForceUnits=Hz))
	TArray<int32> DesktopFrameRateLimits; // 桌面帧率限制列表

	// 用户可以在选项中启用的性能统计信息列表
	UPROPERTY(EditAnywhere, Config, Category=Stats)
	TArray<FLyraPerformanceStatGroup> UserFacingPerformanceStats; // 面向用户的性能统计组列表
};